package web;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import org.birrap.ejb.BaresCervezasTapasVasosTBeanLocal;
import org.birrap.ejb.BaresUsuarioTBeanLocal;
import org.birrap.entities.BaresCervezasTapasVasosT;
import org.birrap.entities.BaresT;
import org.birrap.entities.BaresUsuarioT;
import org.birrap.entities.BaresUsuarioTPK;
import org.birrap.entities.UsuariosT;
import org.primefaces.event.map.OverlaySelectEvent;
import org.primefaces.model.map.DefaultMapModel;
import org.primefaces.model.map.LatLng;
import org.primefaces.model.map.MapModel;  
import org.primefaces.model.map.Marker;

@ManagedBean
@SessionScoped
public class DetalleManagedBean implements Serializable {
    
    @EJB
    private BaresUsuarioTBeanLocal baresUsuarioTBeanLocal;
    
    @EJB
    private BaresCervezasTapasVasosTBeanLocal baresCervezasTapasVasosBean;
    
    private BaresT bar = new BaresT();
    
    private MapModel advancedModel;  
  
    private Marker marker;
    
    private Double centerLatitude;
    private Double centerLongitude;
    
    private boolean isTelefono = false;
    
    private String fotoBar = null;
    
    private UsuariosT usuario;
    
    private List<BaresCervezasTapasVasosT> listaCervezas;

    
    private static final String RUTA_IMAGEN = "/images/bares/";
    private static final String IMAGEN_NO_DISPONIBLE = "imagenNoDisponible.jpg";
    
    private String mensajeSocial = null;
    
    private double cervezaMasBarataEnBar;
    
    public DetalleManagedBean() 
    {
        bar = new BaresT();
        advancedModel = new DefaultMapModel();  
        usuario = (UsuariosT) FacesContext.getCurrentInstance()
                                        .getExternalContext()
                                        .getSessionMap()
                                        .get("usuario");
        listaCervezas = new ArrayList<BaresCervezasTapasVasosT>();

    }
    
    private void initializeMap ()
    {
        //Shared coordinates  
        if (bar.getLatitud() != null && bar.getLongitud() != null) 
        {
            LatLng coord1 = new LatLng(bar.getLatitud(), bar.getLongitud());  
            this.setCenterLatitude(bar.getLatitud());
            this.setCenterLongitude(bar.getLongitud());
            
            advancedModel = new DefaultMapModel();
            
            //Icons and Data   
            advancedModel.addOverlay(new Marker(coord1, bar.getNombre(), fotoBar, "images/maps/bar1.png"));
        }
        else
        {
            FacesContext.getCurrentInstance()
                            .addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN,
                                                               bar.getNombre() + " no dispone de ubicación en el mapa.",
                                                               bar.getNombre() + " no dispone de ubicación en el mapa."));
            advancedModel = new DefaultMapModel();
        }
    }
    
    public MapModel getAdvancedModel() 
    {  
        return advancedModel;  
    }  
      
    public void onMarkerSelect(OverlaySelectEvent event) 
    {  
        marker = (Marker) event.getOverlay();  
    }  
    
    public void anadirBarFavoritos ()
    {
        if (!isBarFavorito() && !esDueno())
        {
            BaresUsuarioT baresUsuario = new BaresUsuarioT();

            BaresUsuarioTPK baresUsuarioTPK = 
                    new BaresUsuarioTPK(bar.getIdBar(), usuario.getCorreo());

            baresUsuario.setBaresUsuarioTPK(baresUsuarioTPK);
            baresUsuario.setUsuariosT(usuario);
            baresUsuario.setBaresT(bar);
            baresUsuario.setDueno("N");

            baresUsuarioTBeanLocal.insert(baresUsuario);

            String mensaje = bar.getNombre() +
                             " añadido a sus favoritos.";

            FacesContext.getCurrentInstance()
                        .addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,
                                                           mensaje, 
                                                           mensaje));
        }
        
        else if(esDueno()){
             String mensaje = bar.getNombre() +
                             " es uno de sus locales, consulte la lista en la ventana de Perfil/Locales.";

            FacesContext.getCurrentInstance()
                        .addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN,
                                                           mensaje, 
                                                           mensaje));
        }
        else
        {
            String mensaje = bar.getNombre() +
                             " ya es uno de sus favoritos.";
            
            FacesContext.getCurrentInstance()
                        .addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN,
                                                           mensaje, 
                                                           mensaje));
        }
    }
    
    /**
     * Metodo con el que comprobamos al cargar la pagina si el bar tiene ubicacion
     * y en el caso de que no la tenga mostramos un mensaje informativo.
     */
    public void compruebaUbicacion ()
    {
        if (bar.getLatitud() == null || bar.getLongitud() == null) 
        {
            FacesContext.getCurrentInstance()
                        .addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,
                                                               bar.getNombre() + " no dispone de ubicación en el mapa.",
                                                               bar.getNombre() + " no dispone de ubicación en el mapa."));
            advancedModel = new DefaultMapModel();
        }
    }
    
    /**
     * Metodo con el que vemos si el bar ya pertenece a los favoritos del usuario
     * @return boolean
     */
    private boolean isBarFavorito ()
    {
        BaresUsuarioTPK baresUsuarioTPK = new BaresUsuarioTPK();
        baresUsuarioTPK.setCorreo(usuario.getCorreo());
        baresUsuarioTPK.setIdBar(bar.getIdBar());
        
        return baresUsuarioTBeanLocal.findByIdBarAndCorreo(baresUsuarioTPK);
    }
    
    public boolean esDueno() {
        
        BaresUsuarioTPK baresUsuarioTPK = new BaresUsuarioTPK();
        baresUsuarioTPK.setCorreo(usuario.getCorreo());
        baresUsuarioTPK.setIdBar(bar.getIdBar());
        
        return baresUsuarioTBeanLocal.findByIdBarAndCorreoAndDueno(baresUsuarioTPK);
    }
    
    public double getcervezaMasBarataEnBar(BaresCervezasTapasVasosT barCerTapVaso)
    {
        cervezaMasBarataEnBar = 
                baresCervezasTapasVasosBean.findMasBarataByIdBar(barCerTapVaso.getBaresT()
                                           .getIdBar());
        return cervezaMasBarataEnBar;
    }
    
    public List<BaresCervezasTapasVasosT> getListaCervezas()
          {
              
        if(bar!=null){
            

            
            listaCervezas = new ArrayList<BaresCervezasTapasVasosT>();
            List<BaresCervezasTapasVasosT> coleccionBares = new ArrayList<BaresCervezasTapasVasosT>();
                  if(baresCervezasTapasVasosBean.findBaresByIdBar(bar.getIdBar())!=null){  
                    coleccionBares = 
                    new ArrayList(baresCervezasTapasVasosBean.findBaresByIdBar(bar.getIdBar()));
                  }

            for(int i=0; i!=coleccionBares.size(); i++)
            {

                    if(coleccionBares.get(i)!=null  && listaCervezas!=null){
                        listaCervezas.add(coleccionBares.get(i));

                }
            }
        }
        return listaCervezas;
  }

    public void setBar(BaresT bar) {
        this.bar = bar;
        if(bar != null)
        {
            if(bar.getFoto() != null && !bar.getFoto().isEmpty())
            {
                fotoBar = RUTA_IMAGEN;
                fotoBar = fotoBar.concat(bar.getFoto());
            }
            else
            {
                fotoBar = RUTA_IMAGEN;
                fotoBar = fotoBar.concat(IMAGEN_NO_DISPONIBLE);
            }
        }
        if(this.bar != null && this.bar.getIdBar() != null)
        {
            initializeMap();
        }
        
        if(bar != null && bar.getTelefono() != null)
        {
            isTelefono = true;
        }        
    }
    
    public Marker getMarker() 
    {  
        return marker;  
    } 

    public BaresT getBar() {
        return bar;
    }

    public Double getCenterLatitude() {
        return centerLatitude;
    }

    public void setCenterLatitude(Double centerLatitude) {
        this.centerLatitude = centerLatitude;
    }

    public Double getCenterLongitude() {
        return centerLongitude;
    }

    public void setCenterLongitude(Double centerLongitude) {
        this.centerLongitude = centerLongitude;
    }

    public boolean isIsTelefono() {
        return isTelefono;
    }

    public void setIsTelefono(boolean isTelefono) {
        this.isTelefono = isTelefono;
    }

    public String getFotoBar() {
        return fotoBar;
    }

    public void setFotoBar(String fotoBar) {
        this.fotoBar = fotoBar;
    }

    public String getMensajeSocial() {
        if(bar != null && bar.getIdBar() != null)
        {
            mensajeSocial = bar.getNombre() + "\n";
            BaresCervezasTapasVasosT baresCTV = baresCervezasTapasVasosBean.findTodoMasBarataByIdBar(bar.getIdBar());
            mensajeSocial = mensajeSocial + baresCTV.getCervezasT().getMarca() + " " + baresCTV.getCervezasT().getTipo() + " " +
                            baresCTV.getTapasCervezaT().getNombre() + " " + baresCTV.getPrecio() + "€" + "\n" +
                            baresCTV.getBaresT().getDireccion();
        }
        return mensajeSocial;
    }

    public void setMensajeSocial(String mensajeSocial) {
        this.mensajeSocial = mensajeSocial;
    }
    
}
